package cc.lj.internal.coupons.domain.ticket.repository;

import cc.lj.internal.coupons.infrastructure.po.TicketMainPO;
import cc.lj.internal.coupons.interfaces.dto.command.DeleteUseTicketCheckCommand;
import cc.lj.internal.coupons.interfaces.dto.command.UseTicketCheckCommand;

import java.util.Map;

/**
 * 用券验证缓存数据仓储接口
 * @author liangxifeng
 * @date 2023-06-26
 */
public interface IUseTicketCheckCacheRepository {
    /**
     * 新增用券列表数据
     * key1 = use_ticket_合同号_UUID (HASH), value1 = {券使用码:券批次主键}
     * key2 = use_batch_合同号_UUID(HASH), value2 =  {券批次主键 : 使用张数}
     * key4 = global_used_券使用码_合同号_uuid(String 类型，目的：排除一张券在多个端用），value = 券批次主键
     */
    void addUseTicket(TicketMainPO entityPO, UseTicketCheckCommand useTicketCheckCommand);

    /**
     * 设置用券其他数据
     * key3 = batch_other_合同号_UUID (HASH)， value = { single_batch_id: 独立使用的券批次主键, limit_value: 满减剩余额度空间)
     * @param pactNum 合同号
     * @param uuId 唯一识别UUID
     * @param useBatchOther
     */
    void setUseTicketOther(String pactNum,String uuId,Map<String,Object> useBatchOther);


    /**
     * 查询已用券列表 key = use_ticket_合同号_UUID (HASH)
     * @param pactNum 合同号
     * @param uuId UUID
     * @return Map<券使用码，券批次主键>
     */
    Map<String, Integer> getUseTicketList(String pactNum, String uuId);


    /**
     * 查询已用券批次信息 key=use_batch_合同号_UUID(HASH)
     * @param pactNum 合同号
     * @param uuId UUID
     * @return map{券批次主键 : 使用张数}
     */
    Map<Integer,Integer> getUseBatch(String pactNum, String uuId);

    /**
     * 查询已用券其他数据 key3 = batch_other_合同号_UUID (HASH)
     * @param pactNum 合同号
     * @param uuId UUID
     * @return Map<String,Object> { single_batch_id: 独立使用的券批次主键, limit_value: 满减剩余额度空间)
     */
    Map<String,Object> getUseTicketOther(String pactNum, String uuId);

    /**
     * 验证使用码是否可用
     * 1. 验证使用码是否在券使用列表中, 验证key= use_ticket_合同号_UUID (HASH)
     * 2. 全局验证（ 同一个使用码不能在多端使用），验证 key=券使用码_合同号_UUID(String)
     * @param entityPO
     * @param useTicketCheckCommand
     * @return 可用返回true,不可用返回false
     */
    void checkTicketIsUse(TicketMainPO entityPO, UseTicketCheckCommand useTicketCheckCommand);

    /**
     * 删除用券数据, 对应操作redis如下：
     * 1. key1 = use_ticket_合同号_UUID (HASH), value1 = {券使用码:券批次主键} 删除指定使用码
     * 2. key2 = use_batch_合同号_UUID(HASH), value2 =  {券批次主键 : 使用张数} 对应用券批次数量减少
     * 3. key4 = global_used_券使用码_合同号_UUID(String 类型，目的：排除一张券在多个端用），value = 券批次主键，直接删除对应key
     * @param useTicketCheckCommand
     */
    void deleteUseTicket(DeleteUseTicketCheckCommand useTicketCheckCommand);

    /**
     * 打印本合同在redis中已经用券的所有数据
     * @param pactNum 合同号
     * @param uuId 全局唯一uuid
     */
    void printAll(String pactNum, String uuId);

    /**
     * 除本合同的所有用券数据
     * @param pactNum 合同号
     */
    void deleteAll(String pactNum);

}
